#include<iostream>
#include<pthread.h>
#include<string>
#include<stdio.h>
#include<unistd.h>
using namespace std;

// void* handler(void* name)
// {
//     const string s=(char*)name;
//     while(true)
//     {
//         cout<<s<<"进程id为："<<getpid()<<endl;
//         sleep(1);
//     }
// }
// void* handler(void* name)
// {
//     const string s=(char*)name;
//     int count=0;
//     while(true)
//     {
//         cout<<s<<"在运行:"<<count<<endl;
//         count++;
//         sleep(1);
//         if(count==5)
//         {
//             char* p=nullptr;
//             *p='a';//野指针问题
//         }
//     }
// }
// void* handler(void* name)
// {
//     const string s=(char*)name;
//     int count=0;
//     int* arr=new int[5];
//     while(true)
//     {
//         cout<<s<<"在运行:"<<count<<endl;
//         arr[count]=count++;
//         if(count==5)
//             break;
//         sleep(1);
//     }
//     return (void*)arr;
// }
// void* handler(void* name)
// {
//     const string s=(char*)name;
//     cout<<endl;
//     cout<<"新线程id: "<<pthread_self()<<endl;
//     cout<<endl;
//     int count=0;
//     while(true)
//     {
//         cout<<s<<"运行中： "<<count<<endl;
//         count++;
//         if(count==5)
//             break;
//         sleep(1);
//     }
//     cout<<"线程终止"<<endl;
//     pthread_exit((void*)2);
// }
// __thread int g_val=0;
// void* handler(void* num)
// {
//     pthread_detach(pthread_self());//线程分离
//     cout<<"新线程分离"<<endl;

//     while(true)
//     {
//         cout<<"新线程g_val： "<<g_val++<<endl;
//         sleep(1);
//         break;
//     }
//     cout<<"新线程退出"<<endl;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,handler,(void*)"thread-1");
//     while(true)
//     {
//         cout<<"主线程g_val： "<<g_val<<endl;
//         sleep(1);
//     }
    // cout<<"主线程id: "<<pthread_self()<<endl;
    // sleep(3);
    // pthread_cancel(tid);
    // cout<<"3秒后线程取消"<<endl;
    // pthread_join(tid,nullptr);//默认阻塞等待
    // while(true)
    // {
    //     cout<<"main 函数"<<endl;
    //     sleep(1);
    // }
    //int *arr;
    // pthread_join(tid,(void**)&arr);//默认阻塞等待
    // cout<<"主线程获取返回值"<<endl;
    // for(int i=0;i<5;i++)
    // {
    //     cout<<arr[i]<<" ";
    // }
    // cout<<endl;
    // while(true)
    // {
    //     cout<<"主进程在运行"<<endl;
    //     sleep(1);
    // }
    // pthread_t tid[5];
    // char name[64];
    // for(int i=1;i<=5;i++)
    // {
    //     snprintf(name,sizeof(name),"%s-%d","thread",i);
    //     //创建多个线程
    //     pthread_create(&tid[i-1],nullptr,handler,(void*)name);
    //     sleep(1);
    // }
    // while(true)
    // {
    //     cout<<"主线程，pid： "<<getpid()<<endl;
    //     sleep(5);
    // }
//     return 0;
// }
// int tickets=1000;

// void *getTickets(void *mtx)
// {
    
//     while(true)
//     {
//         pthread_mutex_lock((pthread_mutex_t*)mtx);
//         if(tickets > 0)
//         {
//             usleep(rand()%1000);
//             printf("%p: %d\n", pthread_self(), tickets);
//             tickets--;
//             pthread_mutex_unlock((pthread_mutex_t*)mtx);
//         }
//         else{
//             pthread_mutex_unlock((pthread_mutex_t*)mtx);
//             break;
//         }
//     }
//     usleep(rand()%200000);
//     return nullptr;
// }
// int main()
// {
//     srand((unsigned long)time(nullptr) ^ getpid() ^ 0x147);
//     pthread_mutex_t mtx;
//     pthread_mutex_init(&mtx,nullptr);
//     pthread_t tid[5];
//     for(int i=1;i<=5;i++)
//     {
//         //创建多个线程
//         pthread_create(&tid[i-1],nullptr,getTickets,(void*)&mtx);
//     }
//     cout<<"多线程创建完毕"<<endl;
//     for(int i=0;i<5;i++)
//     {
//         pthread_join(tid[i],nullptr);
//     }
//     cout<<"线程等待完毕"<<endl;
//     pthread_mutex_destroy(&mtx);
//     return 0;
// }
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
int num=0;
void* handler1(void* name)
{
    const char* n=(char*)name;
    cout<<n<<"在执行"<<endl;
    
    while(true)
    {
        pthread_mutex_lock(&mtx);
        num++;
        pthread_mutex_unlock(&mtx);
        sleep(1);
        if(num==10)
            break;
    }
    cout<<"线程1退出"<<endl;
    return nullptr;
    
}
void* handler2(void* name)
{
    const char* n=(char*)name;
    cout<<n<<"在执行"<<endl;
    while(true)
    {
        cout<<num<<endl;
        sleep(1);
    }

}
int main()
{
    pthread_t tid1,tid2;
    pthread_create(&tid1,nullptr,handler1,(void*)"thread-1 ");
    pthread_create(&tid1,nullptr,handler2,(void*)"thread-2 ");
    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);

    return 0;
}